Merkezi Olmayan Borsalar(DEX)
Merkezi Olmayan Borsa (DEX), kullanıcıların kripto para birimlerini takas etmelerine olanak tanıyan bir akıllı sözleşme uygulamasıdır. DEX, alıcı ve satıcılar arasında doğrudan bir bağlantı kurar ve merkezi bir borsa sistemi olmadan işlem yapılmasını sağlar. Bu nedenle, DEX'ler, geleneksel borsalardan daha güvenli ve şeffaf kabul edilir.
Bir DEX projesi Scilla dilinde kodlanırken, aşağıdaki adımlar izlenebilir:
- Akıllı Sözleşme Şablonunu Oluşturma: İlk adım, DEX için bir akıllı sözleşme şablonu oluşturmaktır. Bu şablon, temel değişkenleri ve işlevleri içermeli ve borsa işlevselliğini sağlamak için gerekli olan tüm özellikleri içermelidir.
- Sipariş Kitapları için Veri Yapıları Oluşturma: DEX için sipariş kitapları oluşturmak için veri yapılarına ihtiyaç vardır. Bu veri yapıları, satın alma ve satış emirlerini saklamak için kullanılır.
- Sipariş Ekleme ve Kaldırma İşlevlerinin Kodlanması: DEX'te, kullanıcıların sipariş ekleyebilmeleri ve iptal edebilmeleri gereklidir. Bu nedenle, akıllı sözleşmeye sipariş ekleme ve kaldırma işlevleri eklemek önemlidir.
- Sipariş Eşleştirme İşlevlerinin Kodlanması: DEX, alıcı ve satıcılar arasında doğrudan bir bağlantı kurduğu için, siparişlerin eşleştirilmesi için özel bir işlev gerekir. Bu işlev, sipariş kitaplarındaki en iyi fiyatları bulmalı ve siparişleri doğru şekilde eşleştirmelidir.
- Güvenlik Önlemleri Ekleme: DEX projeleri, kullanıcıların güvenliği açısından hassas bir konudur. Bu nedenle, güvenlik önlemleri eklemek çok önemlidir. Örneğin, sipariş onaylama işlemi doğrulanmalı ve fonlar, yalnızca alıcıya teslim edildikten sonra serbest bırakılmalıdır.
- Kullanıcı Arayüzü Tasarımı: DEX projelerinde kullanıcı arayüzü tasarımı yapmak, kullanıcının işlem yapmasını kolaylaştırmak için önemlidir.
Aşağıdaki gibi Scilla kodu örneği, Merkezi Olmayan Borsa (DEX) işlevselliğini sağlamak için tasarlanmış bir akıllı sözleşmedir:
(* Define the main contract *)
contract DEX:
(* Declare the state variables *)
field bids: Map Uint128 (Map ByStr20 Uint128)
field asks: Map Uint128 (Map ByStr20 Uint128)
(* Define the constructor *)
transition init():
self.bids = Emp Uint128 (Map ByStr20 Uint128)
self.asks = Emp Uint128 (Map ByStr20 Uint128)
(* Define the function for adding buy order *)
transition addBuyOrder(price: Uint128, amount: Uint128):
assert(amount > Uint128 0)
if iszero(self.bids[price][tx.origin]):
self.bids[price][tx.origin] := amount
else:
self.bids[price][tx.origin] :=
self.bids[price][tx.origin] + amount
(* Define the function for adding sell order *)
transition addSellOrder(price: Uint128, amount: Uint128):
assert(amount > Uint128 0)
if iszero(self.asks[price][tx.origin]):
self.asks[price][tx.origin] := amount
else:
self.asks[price][tx.origin] :=
self.asks[price][tx.origin] + amount
(* Define the function for removing buy order *)
transition removeBuyOrder(price: Uint128, amount: Uint128):
assert(amount > Uint128 0)
assert(self.bids[price][tx.origin] >= amount)
self.bids[price][tx.origin] :=
self.bids[price][tx.origin] - amount
if self.bids[price][tx.origin] == Uint128 0:
delete self.bids[price][tx.origin]
(* Define the function for removing sell order *)
transition removeSellOrder(price: Uint128, amount: Uint128):
assert(amount > Uint128 0)
assert(self.asks[price][tx.origin] >= amount)
self.asks[price][tx.origin] :=
self.asks[price][tx.origin] - amount
if self.asks[price][tx.origin] == Uint128 0:
delete self.asks[price][tx.origin]
(* Define the function for matching orders *)
transition matchOrders(buyPrice: Uint128, buyAmount: Uint128,
sellPrice: Uint128, sellAmount: Uint128):
assert(buyAmount > Uint128 0)
assert(sellAmount > Uint128 0)
assert(self.bids[buyPrice][tx.origin] >= buyAmount)
assert(self.asks[sellPrice][tx.origin] >= sellAmount)
let totalAmount = min(buyAmount, sellAmount)
let totalPrice = totalAmount * sellPrice
send(totalPrice, to=tx.origin)
self.bids[buyPrice][tx.origin] :=
self.bids[buyPrice][tx.origin] - totalAmount
if self.bids[buyPrice][tx.origin] == Uint128 0:
delete self.bids[buyPrice][tx.origin]
self.asks[sellPrice][tx.origin] :=
self.asks[sellPrice][tx.origin] - totalAmount
if self.asks[sellPrice][tx.origin] == Uint128 0:
delete self.asks[sellPrice][tx.origin]
Yukarıdaki kod, Scilla dilini kullanarak bir Merkezi Olmayan Borsa (DEX) uygulaması oluşturur. Bu kod, alıcı ve satıcıların siparişlerini saklamak için iki ayrı harita ("bids" ve "asks") kullanır. Sonrasında alıcılar ve satıcılar için sipariş ekleme/kaldırma işlevleri tanımlanır ve siparişlerin eşleştirilmesi için bir "matchOrders" fonksiyonu tanımlanmaktadır.